import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { VersioningType } from '@nestjs/common';
import { join } from 'path';
import { NestExpressApplication } from '@nestjs/platform-express'

// 全局中间件
import { GlobalLogger } from './middlewares/GlobalLogger'
// 跨域设置
import * as cors from 'cors'

// 响应拦截
import { ResponseInterceptor } from './common/response'
import { HttpExceptionFilter } from './common/filter'
import { GuardGuard } from './guard/guard.guard'

// session
import * as session from 'express-session'
async function bootstrap() {
  // 要用NestExpressApplication做泛型
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  app.enableVersioning({
    // 开启版本控制，默认就是url，也可以是header
    type: VersioningType.URI,
  })

  // 设置session
  app.use(session({
    secret: 'wwl', // 生成服务端session 签名 可以理解为加盐
    name: 'wwl.session', // 生成客户端cookie 的名字 默认 connect.sid
    cookie: { // 设置返回到前端 key 的属性，默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。
      httpOnly: true,
      maxAge: 1000 * 60 * 60 * 24 * 30
    },
    rolling: true, // 在每次请求时强行设置 cookie，这将重置 cookie 过期时间(默认:false)
    resave: false,
    saveUninitialized: false,
    // resave 为 true 是每次访问都会更新 session，不管有没有修改 session 的内容，而 false 是只有 session 内容变了才会去更新 session。
    // saveUninitalized 设置为 true 是不管是否设置 session，都会初始化一个空的 session 对象。比如你没有登录的时候，也会初始化一个 session 对象，这个设置为 false 就好。


  }))

  // 配置静态服务目录
  app.useStaticAssets(join(__dirname, 'uploads'), {
    prefix: '/uploads'
  })

  // 全局中间件
  app.use(GlobalLogger)
  app.use(cors())
  // 全局响应拦截
  app.useGlobalInterceptors(new ResponseInterceptor())
  // 全局异常过滤器
  app.useGlobalFilters(new HttpExceptionFilter())
  // 全局路由守卫
  app.useGlobalGuards(new GuardGuard())

  await app.listen(process.env.PORT ?? 3003);
}
bootstrap();
